const express = require("express");
const url = require("url")
const http = require("http");
const https = require("https");
const qs = require("querystring");
const app = express();
app.use( express.static("./www") );

// 拦截所有请求，准备代理
app.get("*", (req, res)=>{
  if(req.url !== "/favicon.ico"){
    // 接收真正要请求的资源信息
    const { target, method, data } = req.query;
    const arr = data.slice(1, -1).split(/,\s*/);
    const obj = {};
    arr.forEach(val=>{
      obj[val.split(":")[0]] = isNaN(val.split(":")[1]) ? (val.split(":")[1]==="true" ? true : (val.split(":")[1]==="false" ? false : val.split(":")[1])) : val.split(":")[1]-0;
    })
    // 将真正要请求的资源地址，转成对象，方便解析
    const urlObj = url.parse(target);
    // 根据协议决定发起请求的模块（http | https）
    const requestObj = urlObj.protocol==="http:" ? http : https;
    // 判断请求方式
    if(method === "get"){
      // 发起get请求
      // 参数1：url
      // 参数2：请求成功后的回调，形参：响应对象
      requestObj.get(target, (targerRes)=>{
        // 响应对象需要通过data事件监听不断获取响应数据
        let str = "";
        targerRes.on("data",(chunk)=>{
          str += chunk;
        })
        // 响应对象需要通过end事件监听数据接收完毕
        targerRes.on("end", ()=>{
          // 将接收到的跨域数据响应给自己的前端
          res.send({
            code:1,
            msg:"跨域数据获取成功",
            data: JSON.parse(str)
          });
        })
      })
    }else{
      // post发送请求的配置对象
      const ops = {
        protocol: urlObj.protocol,
        hostname: urlObj.hostname,
        pathname: urlObj.pathname,
        port: urlObj.protocol === "http" ? 80 : 443,
        contentType: "application/x-www-form-urlencoded"
      }
      // 发起post请求
      // 参数1：配置对象
      // 参数2：同get方式
      const req = requestObj.request(ops, (targerRes)=>{
        let str = "";
        targerRes.on("data",(chunk)=>{
          str += chunk;
        })
        targerRes.on("end", ()=>{
          res.send({
            code:1,
            msg:"跨域数据获取成功",
            data: str
          });
        })
      })
      // post携带数据，需要使用req.write方法
      // 格式：key=val&key=val
      req.write(qs.stringify(obj));
    }
  }
})
app.listen(3000);